#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <signal.h>

void handler(int arg){ //信号处理函数
    if (arg == SIGTSTP){
        printf("SIGTSTP被捕捉到了\n");
    }

    if (arg == SIGQUIT){
        printf("SIGQUIT被捕捉到了\n");
    }

    if (arg == SIGINT){
        printf("SIGINT被捕捉到了\n");
        kill(getpid(),SIGKILL); //给前进程发送杀死信号
    }
}

int main(int argc, char const *argv[])
{
    int ret = -1;
    struct sigaction act, oldact;
    if(signal(SIGTSTP,handler) == SIG_ERR){ //捕捉SIGTSTP信号（快捷键ctl+z），使用handler处理
        printf("signal failed\n");
        return -1;
    }

    if(signal(SIGINT,handler) == SIG_ERR){ //捕捉SIGINT信号（快捷键ctl+c），使用handler处理
        printf("signal failed\n");
        return -2;
    }

    memset(&act, 0, sizeof(act));
    memset(&oldact, 0, sizeof(oldact));
    act.sa_handler = handler;
    act.sa_flags = 0;
    ret = sigaction(SIGQUIT, &act, &oldact); //捕捉SIGQUIT信号（快捷键ctl+\），使用handler处理
    if(ret < 0){
        printf("sigaction failed\n");
        return -3;
    }

    while(1){ //死循环让进程一直运行，使用快捷键ctl+z,ctl+\终端会有打印信息，使用快捷键ctl+c会杀死当前进程
        pause(); //阻塞等待任意信号的产生
        printf("hello world!\n");
        sleep(1);
    } 
    return 0;
}